/*

Чтобы все работало, нужно создать базу данных - у меня это blog - и создать в ней коллекцию, в моем случае - movies

Каждый элемент в movies выглядит так:
{
  "_id": ObjectId(...), <--- это дефолтный ключ любого элемента в БД, его нельзя удалить или изменить. Так работает MongoDB
  "title": string,
  "description": string,
  "comments": array
}

Также нужно создать файл .env в корне проекта и записать туда MONGO_URL="строка подключения к бд"

*/

// Импортируем экспресс
const express = require("express");

// Создаем приложение на экспрессе
const app = express();

// Импортируем переменные окружения
require("dotenv").config();

// Импортируем клиент МонгоДБ
const MongoClient = require("mongodb").MongoClient;

// Создаем клиент
const client = new MongoClient(process.env.MONGO_URL, { useNewUrlParser: true });

// Функция, которая будет возвращать инфу из БД
// @return {results} array все фильмы в виде массива
async function getInfo() {
  // Подключаемся
  await client.connect();

  // Подключаемся к БД
  const db = client.db("blog");

  // Получаем коллекцию
  const collection = db.collection("movies");

  // Ищем ВСЕ документы в коллекции
  const results = await collection.find();

  // Переводим результат в массив и возвращаем
  return results.toArray();
}

// Функция добавления комментария
// @param {title} string заголовок фильма, куда нужно добавить коммент
// @param {comment} string текст комментария
async function addComment(title, comment) {
  // Подключаемся
  await client.connect();

  // Подключаемся к БД
  const db = client.db("blog");

  // Получаем коллекцию
  const collection = db.collection("movies");

  // Ищем все документы. На выходе получим инфу типа Cursor
  const cursor = await collection.find({"title": title});

  // Переводим курсор в массик
  const comments = await cursor.toArray()

  // Проходимся по каждому элементу и записываем в commentsArray только комментарии из кадого документа
  const commentsArray = comments.map(comment => comment.comments)[0]

  // Добавляем новый комментарий
  commentsArray.push(comment)

  // Обновляем документ, в котором title равен title из аргументов функции addComment(), заменяем в нем комментарии
  collection.updateOne({"title": title}, {"$set": {"comments": commentsArray}} )
  return '1';
}

// Говорим серверу, как обрабатывать файлы - обрабатываем как ejs - embedded javascript
app.set('view engine', 'ejs');
// Указываем статичные файлы, чтобы потом их подключить
app.use(express.static('public'));

// Прописываем корневой путь. При входе на localhost:3000/ будет выполняться код снизу
app.get("/", async (req, res) => {
  // Записываем результаты
  const results = await getInfo();

  // Рендерим главную страницу, передавая параметр с результатами
  res.render("index", { results });
});

// Прописываем путь для ПОСТ запроса - то, как мы будем добавлять новые комментарии
// /add_comment/названиефильма/тексткомментария - то есть 2 последних слова URL могут быть любыми
app.post('/add_comment/:movieTitle/:comment', async (req, res) => {
  // В консоли получим название фильма
  // console.log(req.params.movieTitle);
  // В консоли получим комментарий
  // console.log(req.params.comment);

  // Записываем комментарий
  addComment(req.params.movieTitle, req.params.comment)
})

// Запускаем сервер на 3000 порту
app.listen(3000, () => {
  console.log("Сервер запущен");
});
